import { defineStore } from 'pinia'
import { login, getInfo, logout as logoutApi, getCaptcha } from '@/api/user'
import { getToken, setToken, removeToken, getUserInfo, setUserInfo, removeUserInfo } from '@/utils/auth'
import router from '@/router'

export const useUserStore = defineStore('user', {
    state: () => ({
        token: getToken(),
        userInfo: getUserInfo(),
        roles: [],
        permissions: [],
        isLoggingOut: false,
        captchaImg: '',
        captchaUuid: ''
    }),

    getters: {
        // 判断用户是否已登录
        isLoggedIn: (state) => {
            return !!state.token && state.token.length > 0
        }
    },

    actions: {
        // 获取验证码
        async getCaptcha() {
            try {
                const res = await getCaptcha()
                if (res.code === 200) {
                    this.captchaImg = res.data.img
                    this.captchaUuid = res.data.uuid
                    return res.data
                }
                throw new Error(res.msg || '获取验证码失败')
            } catch (error) {
                console.error('获取验证码失败:', error)
                throw error
            }
        },

        // 登录
        async login(userInfo) {
            try {
                console.log('开始登录请求...')
                const res = await login(userInfo)
                console.log('登录响应:', res)
                
                if (res.code === 200) {
                    const token = res.data.token
                    // 直接使用后端返回的token，不添加Bearer前缀
                    console.log('设置token:', token)
                    
                    // 保存token到sessionStorage
                    setToken(token)
                    this.token = token
                    this.userInfo = res.data.user
                    this.roles = res.data.roles || []
                    this.permissions = res.data.menus || []
                    
                    // 保存用户信息到sessionStorage
                    setUserInfo(res.data.user)
                    
                    // 验证token是否正确保存
                    const savedToken = getToken()
                    console.log('保存后的token:', savedToken)
                    
                    if (savedToken !== token) {
                        console.error('Token保存异常！保存的值与设置的值不一致')
                    }
                    
                    return res.data
                } else {
                    throw new Error(res.msg || '登录失败')
                }
            } catch (error) {
                console.error('登录异常:', error)
                removeToken()
                removeUserInfo()
                throw error
            }
        },

        // 获取用户信息
        async getInfo() {
            // 只检查token是否有效，允许userInfo为空的情况
            if (!this.token) {
                console.warn('获取用户信息失败：token不存在')
                return null
            }
            
            try {
                const res = await getInfo()
                
                if (res.code === 200) {
                    console.log('获取用户信息成功:', res.data)
                    
                    // 处理从/getInfo返回的数据结构
                    const apiData = res.data || {}
                    
                    // /getInfo接口返回的数据格式：{ user: {...}, roles: [...], menus: [...] }
                    let userData = apiData.user || {}
                    const roles = apiData.roles || []
                    const menus = apiData.menus || []
                    
                    // 确保用户数据有一个ID字段
                    const userId = userData.userId || userData.id || userData.user_id
                    
                    if (userId) {
                        console.log('成功获取用户ID:', userId)
                        userData.id = userId
                    } else {
                        console.warn('无法获取用户ID，部分功能可能受限')
                    }
                    
                    // 确保用户数据有必要的字段
                    userData.username = userData.username || userData.userName || userData.user_name || ''
                    userData.nickName = userData.nickName || userData.nickname || userData.nick_name || userData.username || ''
                    userData.phone = userData.phone || userData.phoneNumber || userData.phone_number || ''
                    userData.email = userData.email || ''
                    userData.avatar = userData.avatar || ''
                    userData.userId = userData.userId || userData.user_id || userData.id || ''
                    
                    // 更新store中的用户信息
                    this.userInfo = userData
                    this.roles = roles
                    this.permissions = []
                    
                    // 保存更新后的用户信息
                    setUserInfo(userData)
                    
                    console.log('用户角色:', roles)
                    
                    return {
                        userData,
                        roles,
                        menus
                    }
                } else {
                    console.warn('获取用户信息接口返回错误:', res.msg)
                    return this.userInfo
                }
            } catch (error) {
                console.error('获取用户信息出现异常:', error)
                return this.userInfo
            }
        },

        // 退出登录
        async logout(skipApi = false) {
            try {
                // 如果已经在登出过程中，直接返回
                if (this.isLoggingOut) {
                    return
                }
                this.isLoggingOut = true

                // 只有在需要时才调用登出接口
                if (!skipApi) {
                    try {
                        await logoutApi()
                    } catch (error) {
                        console.error('调用登出接口失败:', error)
                    }
                }
            } finally {
                // 无论成功失败都清除用户信息
                this.token = ''
                this.userInfo = null
                this.roles = []
                this.permissions = []
                removeToken()
                removeUserInfo()
                this.isLoggingOut = false
                
                // 登出后跳转到首页
                router.push('/')
            }
        },

        // 获取经纪人信息
        async getAgentInfo(_, agentId) {
            try {
                // 导入API
                const { getAgentInfo } = await import('@/api/agent');
                const response = await getAgentInfo(agentId);
                if (response.code === 200) {
                    return response.data;
                }
                return null;
            } catch (error) {
                console.error('获取经纪人信息失败:', error);
                return null;
            }
        }
    }
}) 